热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

客体|抽象思维_注解深入浅出(三插桩)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了注解深入浅出(三插桩)相关的知识,希望对你有一定的参考价值。第二章注解深入浅出

篇首语:本文由编程笔记#小编为大家整理,主要介绍了注解深入浅出(三插桩)相关的知识,希望对你有一定的参考价值。



第二章注解深入浅出


  • 三、插桩
    • 3.1 什么是插桩
    • 3.2 字节码操作框架
    • 3.3 ASM 的使用



三、插桩

3.1 什么是插桩

QQ 空间曾经发布的《热修复解决方案》中利用 Javaassist 库实现向类的构造函数中插入一段代码解决 CLASS_ISPREVERIFIED 问题。包括了 Instant Run 的实现以及参照 Instant Run 实现的热修复美团 Robus 等都利用到了插桩技术。

插桩就是将一段代码插入或者替换原本的代码。字节码插桩顾名思义就是在我们编写的源码编译成字节码(Class)后,在 android 下生成 dex 之前修改 Class 文件,修改或者增强原有代码逻辑的操作。



我们需要查看方法执行耗时,如果每一个方法都需要自己手动去加入这些内容,当不需要时也需要一个个删去相应的代码。一个、两个方法还好,如果由 10 个、20 个得多麻烦!所以可以利用注解来标记需要插桩的方法,结合编译后操作字节码来帮助我们自动插入,当不需要时关掉插桩即可。这种 AOP 思想让我们只需关注插桩代码本身。

AOP:Aspect Oriented Programming,面向切面编程,通过预编译方式和运行期间动态代码实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

OOP:Object Oriented Programming,面向对象程序设计,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事务特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。


3.2 字节码操作框架

上面我们提到 QQ 空间使用了 Javaassist 来进行字节码插桩,除了 Javaassist 之外还有一个应用更为广泛的 ASM 框架同样也是字节码操作框架,Instant Run 包括 AspectJ 就是借助 ASM 来实现各自的功能。

我们非常熟悉的 JSON 格式数据是基于文本的,我们只需要知道它的规则就能够轻松的生成、修改 JSON 数据。同样的 Class 字节码也有其自己的规则(格式)。操作 JSON 可以借助 GSON 来非常方便的生成、修改 JSON 数据。而字节码 Class,同样可以借助 Javaassist/ASM 来实现对其修改。


字节码操作框架的作用在于生成或者修改 Class 文件,因此在 Android 中字节码框架本身是不需要打包进入 APK 的,只有其生成/修改之后的 Class 才需要打包进入 APK 中。它的工作时机在上图 Android 打包流程中的生成 Class 之后,打包 dex 之前。


3.3 ASM 的使用

ASM 可以直接从 jcenter() 仓库中引入,我们可以进入 https://bintray.com/ 进行搜索:


点击 图片第二个红框,可以看到最新的正式版本为:8.0.1


点击版本号查看引入:


所以,在 AS 中加入:

dependencies
testImplementation 'org.ow2.asm:asm:8.0.1'
testImplementation 'org.ow2.asm:asm-commons:8.0.1'

需要注意的是,使用 testImplementation 引入,这表示只能在 Java 的单元测试中使用这个框架,对 Android 中的依赖关系没有任何影响。

AS 中使用 gradle 的 Android 工程会自动创建 Java 单元测试与 Android 单元测试,测试代码分别在 test 与 androidTest。

详细的插桩细节参考以下两个文章:
关于java字节码框架ASM的学习
Java ASM 技术简介


推荐阅读
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • Hadoop集群搭建:实现SSH无密码登录
    本文介绍了如何在CentOS 7 64位操作系统环境下配置Hadoop集群中的SSH无密码登录,包括环境准备、用户创建、密钥生成及配置等步骤。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
author-avatar
手机用户2602931131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有